package com.baike.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;

import javax.sql.DataSource;
import java.util.Properties;

@Configuration  //定时调度配置类
public class ScheduleConfig {

    @Bean
    public SchedulerFactoryBean schedulerFactoryBean(DataSource dataSource){
        SchedulerFactoryBean factory = new SchedulerFactoryBean();
        factory.setDataSource(dataSource);

        //quartz 参数
        Properties prop = new Properties();
        // 调度标识名 集群中每一个实例都必须使用相同的名称
        prop.put("org.quartz.scheduler.instanceName","CmiipScheduler");
        // 调度器实例编号自动生成 每个实例不能相同
        prop.put("org.quartz.scheduler.instanceId","AUTO");

        //线程池配置
        // 实例化ThreadPool时 使用的线程类 SimpleThreadPool（一般使用这个）
        prop.put("org.quartz.threadPool.class","org.quartz.simpl.SimpleThreadPool");
        //  并发个数 指定线程数 至少为1 （无默认值）一般1-100 之间的整数
        prop.put("org.quartz.threadPool.threadCount","20");
        //设置线程的优先级（最大为 java.lang.Thread.MAX_PRIORITY 10  最少1 默认 5）
        prop.put("org.quartz.threadPool.threadPriority","5");


        //数据库方式 JobStore
        prop.put("org.quartz.JobStore.class","org.quartz.impl.jdbcjobstore.JobStoreTX");
        //持久化方式配置数据驱动 ORACLE数据
       // prop.put("org.quartz.jobStore.driverDelegateClass","org.quartz.impl.jdbcjobstore.oracle.OracleDelegate");
       // prop.put("org.quartz.jobStore.driverDelegateClass","org.quartz.impl.jdbcjobstore.MSSQLDelegate");
        prop.put("org.quartz.jobStore.driverDelegateClass","org.quartz.impl.jdbcjobstore.StdJDBCDelegate");

        // 开启分布式部署 集群
        prop.put("org.quartz.jobStore.isClustered","true");

        //分布式节点有效性检查时间间隔 单位 毫秒 默认 15000
        prop.put("org.quartz.jobStore.clusterCheckinInterval","15000");
        prop.put("org.quartz.jobStore.maxMisfiresToHandleAtATime","1");
        prop.put("org.quartz.jobStore.txIsolationLevelSerializable","false");

        //容许的最大作业延迟时间 最大能忍受的触发时间， 如果超过则认为 ‘失误’ 不管在内存中还是在数据中都要配置
        prop.put("org.quartz.jobStore.misfireThreshold","12000");
        //quartz 相关数据表 表名前缀
        prop.put("org.quartz.jobStore.tablePrefix","QRTZ_");
        factory.setQuartzProperties(prop);

        //调度标识名 集群中的每一个实例都必须使用相同的名字
        factory.setSchedulerName("CmiipScheduler");
        //延时启动
        factory.setStartupDelay(1);
        factory.setApplicationContextSchedulerContextKey("applicationContextKey");
        //可选 QuartzScheduler
        // 启动时更新已存在的Job 这样就不要每次修改targetObject后删除 qrtz_job_details表对应的记录了
        factory.setOverwriteExistingJobs(true);
        //设置自动启动 默认true
        factory.setAutoStartup(true);

        return factory;
    }

}
